﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Joel.Vishnu.Presentacion;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Presentacion.Vistas;

namespace Joel.Vishnu.Formularios
{
    public partial class Empleados : Form, IEmpleados
    {
        #region Constructores

        public Empleados()
        {
            InitializeComponent();
            presentador = new EmpleadosPresentador(this);
            grdEmpleados.AutoGenerateColumns = false;
            grdEmpleados.DataSource = bsEmpleados;
        }

        #endregion

        #region Atributos

        private EmpleadosPresentador presentador;
        private EnumEstado estado;
        private Int32 empleadoId;

        #endregion

        #region Propiedades

        public Int32 EmpleadoId
        {
            get { return empleadoId; }
        }

        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        public String Apellido
        {
            get { return txtApellido.Text; }
        }

        public Int32 Dni
        {
            get
            {
                if (String.IsNullOrWhiteSpace(txtDni.Text))
                    return 0;
                else
                    return Convert.ToInt32(txtDni.Text);
            }
        }

        public String Telefono
        {
            get { return txtTelefono.Text; }
        }

        public String Direccion
        {
            get { return txtDireccion.Text; }
        }

        public Int32 BarrioId
        {
            get { return (Int32)cboBarrio.SelectedValue; }
        }

        public List<Barrio> ListaBarrios
        {
            set
            {
                cboBarrio.ValueMember = "Id";
                cboBarrio.DisplayMember = "Nombre";
                cboBarrio.DataSource = value;
            }
        }

        public String Email
        {
            get { return txtEmail.Text; }
        }

        public Int32 GeneroId
        {
            get
            {
                if (radMasculino.Checked)
                    return 1;
                else
                    return 2;
            }
        }

        public DateTime FechaContratacion
        {
            get { return dtpFechaContratacion.Value; }
        }

        public DateTime FechaCumpleanos
        {
            get { return dtpFechaCumpleanos.Value; }
        }

        public Int32 EstadoCivilId
        {
            get { return (Int32)cboEstadoCivil.SelectedValue; }
        }

        public List<EstadoCivil> ListaEstadosCiviles
        {
            set
            {
                cboEstadoCivil.ValueMember = "Id";
                cboEstadoCivil.DisplayMember = "Nombre";
                cboEstadoCivil.DataSource = (from item in value
                                             orderby item.Nombre ascending
                                             select item).ToList();
            }
        }

        public String ContactoEmergenciaNombre
        {
            get { return txtContactoEmergenciaNombre.Text; }
        }

        public String ContactoEmergenciaTelefono
        {
            get { return txtContactoEmergenciaTelefono.Text; }
        }

        public Decimal Salario
        {
            get { return numSalario.Value; }
        }

        public EnumEstado Estado
        {
            get { return estado; }
        }

        public List<Empleado> ListaEmpleados
        {
            set { bsEmpleados.DataSource = value; }
        }

        #endregion

        #region Metodos

        public void ActualizarDatos()
        {
            if (bsEmpleados.Current != null)
            {
                empleadoId = ((Empleado)bsEmpleados.Current).Id;
                txtNombre.Text = ((Empleado)bsEmpleados.Current).Nombre;
                txtApellido.Text = ((Empleado)bsEmpleados.Current).Apellido;
                txtDni.Text = Convert.ToString(((Empleado)bsEmpleados.Current).Dni);
                txtTelefono.Text = ((Empleado)bsEmpleados.Current).Telefono;
                txtDireccion.Text = ((Empleado)bsEmpleados.Current).Direccion;
                cboBarrio.SelectedValue = ((Empleado)bsEmpleados.Current).Barrio.Id;
                txtEmail.Text = ((Empleado)bsEmpleados.Current).Email;
                if (((Empleado)bsEmpleados.Current).Genero.Id == 1)
                {
                    radMasculino.Checked = true;
                    radFemenino.Checked = false;
                }
                else
                {
                    radMasculino.Checked = false;
                    radFemenino.Checked = true;
                }
                dtpFechaContratacion.Text = Convert.ToString(((Empleado)bsEmpleados.Current).FechaContratacion);
                dtpFechaCumpleanos.Text = Convert.ToString(((Empleado)bsEmpleados.Current).FechaCumpleanos);
                cboEstadoCivil.SelectedValue = ((Empleado)bsEmpleados.Current).EstadoCivil.Id;
                txtContactoEmergenciaNombre.Text = ((Empleado)bsEmpleados.Current).ContactoEmergenciaNombre;
                txtContactoEmergenciaTelefono.Text = ((Empleado)bsEmpleados.Current).ContactoEmergenciaTelefono;
                numSalario.Value = ((Empleado)bsEmpleados.Current).Salario;
            }
            else
                LimpiarCampos();
        }

        public void HabilitarControles()
        {
            //lblId.Enabled = !lblId.Enabled;
            lblNombre.Enabled = !lblNombre.Enabled;
            lblApellido.Enabled = !lblApellido.Enabled;
            lblDni.Enabled = !lblDni.Enabled;
            lblTelefono.Enabled = !lblTelefono.Enabled;
            lblDireccion.Enabled = !lblDireccion.Enabled;
            lblBarrio.Enabled = !lblBarrio.Enabled;
            lblEmail.Enabled = !lblEmail.Enabled;
            lblGenero.Enabled = !lblGenero.Enabled;
            lblFechaContratacion.Enabled = !lblFechaContratacion.Enabled;
            lblFechaCumpleanos.Enabled = !lblFechaCumpleanos.Enabled;
            lblEstadoCivil.Enabled = !lblEstadoCivil.Enabled;
            lblContactoEmergenciaNombre.Enabled = !lblContactoEmergenciaNombre.Enabled;
            lblContactoEmergenciaTelefono.Enabled = !lblContactoEmergenciaTelefono.Enabled;
            lblSalario.Enabled = !lblSalario.Enabled;

            txtNombre.Enabled = !txtNombre.Enabled;
            txtApellido.Enabled = !txtApellido.Enabled;
            txtDni.Enabled = !txtDni.Enabled;
            txtTelefono.Enabled = !txtTelefono.Enabled;
            txtDireccion.Enabled = !txtDireccion.Enabled;
            cboBarrio.Enabled = !cboBarrio.Enabled;
            txtEmail.Enabled = !txtEmail.Enabled;
            radFemenino.Enabled = !radFemenino.Enabled;
            radMasculino.Enabled = !radMasculino.Enabled;
            dtpFechaContratacion.Enabled = !dtpFechaContratacion.Enabled;
            dtpFechaCumpleanos.Enabled = !dtpFechaCumpleanos.Enabled;
            cboEstadoCivil.Enabled = !cboEstadoCivil.Enabled;
            txtContactoEmergenciaNombre.Enabled = !txtContactoEmergenciaNombre.Enabled;
            txtContactoEmergenciaTelefono.Enabled = !txtContactoEmergenciaTelefono.Enabled;
            numSalario.Enabled = !numSalario.Enabled;

            btnAceptar.Enabled = !btnAceptar.Enabled;
            btnCancelar.Enabled = !btnCancelar.Enabled;
            btnInsertar.Enabled = !btnInsertar.Enabled;
            btnModificar.Enabled = !btnModificar.Enabled;
            btnEliminar.Enabled = !btnEliminar.Enabled;

            grdEmpleados.Enabled = !grdEmpleados.Enabled;
        }

        public void LimpiarCampos()
        {
            try
            {
                txtNombre.Text = String.Empty;
                txtApellido.Text = String.Empty;
                txtDni.Text = String.Empty;
                txtTelefono.Text = String.Empty;
                txtDireccion.Text = String.Empty;
                cboBarrio.Text = String.Empty;
                txtEmail.Text = String.Empty;
                radMasculino.Checked = true;
                radFemenino.Checked = false;
                dtpFechaContratacion.Text = String.Empty;
                dtpFechaCumpleanos.Text = String.Empty;
                cboEstadoCivil.Text = String.Empty;
                txtContactoEmergenciaNombre.Text = String.Empty;
                txtContactoEmergenciaTelefono.Text = String.Empty;
                numSalario.Value = 0;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion

        #region Eventos

        private void txtDni_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
                e.SuppressKeyPress = true;
        }

        private void Empleados_Load(object sender, EventArgs e)
        {
            try
            {
                presentador.Inicialiar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnInsertar_Click(object sender, EventArgs e)
        {
            try
            {
                estado = EnumEstado.NUEVO;
                HabilitarControles();
                LimpiarCampos();
                txtNombre.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (bsEmpleados.Current != null)
            {
                try
                {
                    estado = EnumEstado.MODIFICAR;
                    HabilitarControles();
                    txtNombre.Focus();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            else
                MessageBox.Show("Debe seleccionar un empleado de la lista.");
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (bsEmpleados.Current != null)
            {
                if (MessageBox.Show("¿Está seguro que desea eliminar el empleado seleccionado?", "Eliminar empleado", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    try
                    {
                        presentador.Eliminar();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
            else
                MessageBox.Show("Debe seleccionar un empleado de la lista.");
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                presentador.Aceptar();
                HabilitarControles();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                HabilitarControles();
                ActualizarDatos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void grdEmpleados_SelectionChanged(object sender, EventArgs e)
        {
            ActualizarDatos();
        }

        #endregion
    }
}
